home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Peripherals / MacinTalk / Interfaces / MPW / Standard Speech / SSpeechImplementation.a next >
Text File  |  1989-04-13  |  13KB  |  400 lines

  1. ;-------------------------------------------------------------------------------;
  2. ;                                            ;
  3. ;      SpeechGlue -  Interface for PASCAL programs using the                ;
  4. ;                Macintalk speech driver.                    ;
  5. ;                                            ;
  6. ;      Copyright 1984, Joseph Katz / Mark Barton.  Not to be copied or       ;
  7. ;      distributed without the express written permission of the authors.    ;
  8. ;                                            ;
  9. ;      Modification History:                                ;
  10. ;           06/02/85 - Modified only minutes before shipment of software     ;
  11. ;              supplement.  Modified to separate code and data       ;
  12. ;              segments.  This was done in a vast hurry.  There      ;
  13. ;              are no known bugs in it, but it was not done cleanly. ;
  14. ;
  15. ;    04/02/86 Mike Millen    Converted to MPW assembly.
  16. ;    07/24/87 Jordan Mattson    & Brian Wong
  17. ;                            Updated Include definitions for MPW 2.0b1 
  18. ;                                Compatability
  19. ;                                            ;
  20. ;                                            ;
  21. ;-------------------------------------------------------------------------------;
  22.  
  23.  
  24.           BLANKS    ON
  25.           STRING    ASIS
  26.  
  27.           PRINT     OFF
  28.           INCLUDE   'SysEqu.a'
  29.           INCLUDE   'Traps.a'
  30.           INCLUDE   'SysErr.a'
  31.           INCLUDE   'ToolEqu.a'
  32.           PRINT     ON
  33.  
  34.  
  35. RdrHandle    EQU    52          ;PBLOCK OFFSET OF HANDLE TO READER CODE
  36. RulesFN         EQU    60          ;OFFSET TO READER EXCEPTIONS FILENAME POINTER
  37.  
  38. IDPitchMode  EQU    0
  39. IDRate         EQU    2          ;ID=1 IS USED FOR KILLIO
  40. IDSex         EQU    3          ;RESERVED FOR FUTURE IMPLEMENTATION
  41. IDBaseline   EQU    4
  42.  
  43. fullUnitT    EQU    -4000     ;ERROR CODE FOR DRIVER TABLE FULL
  44.  
  45. Pblock         EQU    0          ;OFFSET TO IOPARMBLOCK
  46. ReaderHandle EQU    66          ;OFFSET TO READER HANDLE
  47. SpeechRfNum  EQU    70          ;OFFSET TO SPEECH DRIVER REFERENCE NUMBER
  48. TalkRefNum   EQU    74          ;OFFSET TO TALK PACKAGE REFNUM
  49.  
  50.  
  51. ; FUNCTION SpeechOn(EXCPFile: Str255; VAR SpeechHandle: SpeechRecord): SpeechErr;
  52.  
  53. ; Open speech driver. This is complicated by the need to arbitrate the
  54. ; driver unit number, which must be done prior to the actual device open.
  55.  
  56. SpeechOn  FUNC         EXPORT    
  57.  
  58.           MOVE.L    A2,-(SP)            ;SAVE A2 ON STACK
  59.  
  60. ; Try to allocate driver globals area
  61.           MOVE.L    #100,D0                ;GRAB 100 BYTES
  62.           _NewHandle
  63.           MOVE.L    8(SP),A1            ;GET SPEECH RECORD ADDR
  64.           MOVE.L    A0,(A1)                ;SAVE GLOBALS HANDLE
  65.           TST.W        D0
  66.           BNE.S        ONERROR                ;IF ERROR, JUST RETURN
  67.           _HLock                        ;LOCK HANDLE
  68.           MOVE.L    (A0),A2                ;SAVE POINTER TO GLOBALS
  69.  
  70. ; Clear parm block
  71.           MOVEQ        #0,D0
  72.           MOVEQ        #24,D1
  73.           MOVE.L    A2,A0
  74. CLOOP      MOVE.L    D0,(A0)+
  75.           DBF        D1,CLOOP
  76.  
  77. ; Open MacinTalk resource file
  78.  
  79.           CLR.W        -(SP)                ;SPACE FOR RETURN CODE
  80.           PEA        DriverID            ;NAME OF RESOURCE FILE
  81.           _OpenResFile                    ;OPEN IT
  82.           MOVE.W    (SP)+,D0            ;GET RESOURCE FILE ID
  83.           BPL.S        GOTRESFILE            ;GOOD RETURN, BRANCH
  84.           MOVE.W    ResErr,D0            ;SET RETURN CODE
  85.  
  86. ONERROR      MOVE.L    (SP)+,A2            ;RESTORE A2
  87.           MOVE.L    (SP),8(SP)            ;MOVE RETURN ADDR
  88.           ADDQ.L    #8,SP                ;FIX STACK
  89.           MOVE.W    D0,4(SP)            ;SET RETURN CODE
  90.           RTS                            ;AND GO AWAY
  91.  
  92. GOTRESFILE MOVE.W   D0,TalkRefNum(A2)   ;SAVE FILE REFNUM FOR LATER
  93.  
  94.  
  95. ; Set ResPreLoad to FALSE
  96.  
  97.           MOVE.B    #0,-(SP)
  98.           _SetResLoad
  99.  
  100.  
  101. ; Get handle to synthesizer resource; TYPE = DRVR, NAME=MacinTalk
  102.  
  103.           CLR.L        -(SP)            ;SPACE FOR RETURN CODE
  104.           MOVE.L    #'DRVR',-(SP)       ;RESOURCE TYPE
  105.           PEA        SpeechName            ;RESOURCE NAME
  106.           _GetNamedResource            ;GET DRIVER RESOURCE
  107.           MOVE.L    (SP)+,A1            ;GET HANDLE TO RESOURCE (*** WAS AFTER BNE)
  108.           MOVE.W    ResErr,D0            ;GOOD RETURN?
  109.           BNE.S        ONERROR            ;NO, BRANCH TO ERROR RETURN
  110.  
  111.  
  112. ; Restore ResPreLoad to TRUE
  113.  
  114.           MOVE.B    #1,-(SP)
  115.           _SetResLoad
  116.  
  117.  
  118. ; Find an empty slot in driver unit table (looking backwards from end)
  119.  
  120.           MOVE.L    uTableBase,A0       ;GET DRIVER UNIT TABLE BASE
  121.           ADDA.W    #128,A0            ;START AT END+4 OF UNIT TABLE
  122.           MOVE.W    #32,D0            ;LAST UNIT IN TABLE IS #31
  123.  
  124. @3      SUBQ.W    #1,D0            ;REDUCE SLOT NUMBER
  125.           CMP.W        #18,D0            ;NO FREE SLOTS BELOW UNIT 18
  126.           BGT.S        @4
  127.           MOVE.W    #fullUnitT,D0       ;SETUP ERROR CODE
  128.           BRA.S        ONERROR            ;AND GO AWAY
  129.  
  130. @4      CMPI.L    #0,-(A0)            ;IS SLOT EMPTY?
  131.           BNE.S        @3                ;NO, KEEP LOOPING
  132.  
  133.  
  134. ; Change resource ID to new driver number, and load in resource data
  135.  
  136.           MOVE.W    D0,D1            ;DRIVER NUMBER
  137.           ADDQ.W    #1,D1            ;
  138.           NEG.W        D1                ;REF NUMBER
  139.           MOVE.W    D1,SpeechRfNum(A2)  ;SAVE REFERENCE NUMBER
  140.  
  141.           MOVE.L    A1,-(SP)            ;RESOURCE HANDLE
  142.           MOVE.W    D0,-(SP)            ;NEW DRIVER NUMBER
  143.           MOVE.L    #0,-(SP)            ;DON'T CHANGE THE RESOURCE NAME
  144.           _SetResInfo
  145.  
  146.  
  147.           MOVE.L    A1,-(SP)
  148.           _LoadResource
  149.           MOVE.W    resErr,D0            ;FOR DEBUGGING
  150.  
  151.  
  152.           MOVE.L    A1,A0            ;TRANSFER HANDLE TO A0
  153.           _HLock                ;LOCK DRIVER CODE DOWN
  154.  
  155.  
  156. ; Get SpeechOn input parms from stack
  157.  
  158.           MOVE.L    (SP)+,A2            ;RESTORE A2
  159.           MOVE.L    (SP)+,A0            ;GET RETURN ADDRESS
  160.           MOVE.L    (SP)+,D0            ;GET ADDR OF SPEECHREC HANDLE
  161.           MOVE.L    (SP)+,A1            ;GET EXCPS FILENAME PTR
  162.           MOVE.L    A0,-(SP)            ;RESTORE RETURN ADDR
  163.  
  164.           MOVE.L    A2,-(SP)            ;SAVE A2
  165.           MOVE.L    D0,A2            ;ADDR OF DEV GLOBALS HANDLE
  166.           MOVE.L    (A2),A2            ;DEVICE GLOBALS HANDLE
  167.           MOVE.L    A2,-(SP)            ;SAVE DEVICE GLOBALS HANDLE
  168.           MOVE.L    (A2),A2            ;DEREF TO POINTER
  169.  
  170. ; Build parm block and open the driver
  171.  
  172.           LEA        Pblock(A2),A0       ;A0 --> PARM BLOCK
  173.           MOVE.L    A1,RulesFN(A0)      ;SAVE PTR TO EXCPS FILENAME IN PBLOCK
  174.           LEA        SpeechName,A1       ;A1 --> DRIVER NAME
  175.           MOVE.L    A1,IOFileName(A0)   ;STORE DRIVER NAME IN PARM BLOCK
  176.           CLR.W        IODrvNum(A0)        ;USE DEFAULT DRIVE
  177.           CLR.W        IOFileType(A0)      ;CLEAR TYPE/PERMISSIONS
  178.           CLR.L        IOOwnBuf(A0)        ;USE SYSTEM BUFFER
  179.  
  180.           _Open
  181.           MOVE.W    IOResult(A0),12(SP)            ;SAVE RETURN CODE FROM OPEN
  182.           MOVE.L    RdrHandle(A0),ReaderHandle(A2)  ;SAVE HANDLE TO READER CODE
  183.  
  184.           MOVE.L    (SP)+,A0            ;UNLOCK DEVICE GLOBALS
  185.           _HUnlock
  186.  
  187.           MOVE.L    (SP)+,A2            ;RESTORE A2
  188.           RTS
  189.  
  190.  
  191. SpeechName DC.B     7
  192.            DC.B     '.SPEECH'
  193. DriverID   DC.B     9
  194.            DC.B     'MacinTalk'
  195.  
  196.  
  197.  
  198.  
  199. ;  PROCEDURE SpeechOff(SpeechHandle: SpeechRecord);
  200.  
  201. ;      Closes speech driver.
  202.  
  203. SpeechOff PROC         EXPORT   
  204.  
  205.           MOVE.L    A2,-(SP)            ;SAVE A2
  206.           MOVE.L    8(SP),A0            ;GET DEVICE GLOBALS HANDLE
  207.           _HLock
  208.           MOVE.L    (A0),A2            ;DEREFERENCE TO POINTER
  209.  
  210.           LEA        Pblock(A2),A0       ;POINTER TO PARM BLOCK
  211.           _Close    ,IMMED
  212.  
  213.           MOVE.W    TalkRefNum(A2),D0   ;MacinTalk REFNUM
  214.           BEQ.S        @1                ;DONT CLOSE SYSTEM RES FILE
  215.           MOVE.W    D0,-(SP)
  216.           _CloseResFile                ;BYE-BYE
  217.  
  218. @1      MOVE.L    8(SP),A0            ;GET DEVICE GLOBALS HANDLE
  219.           _HUnlock                ;UNLOCK IT
  220.           _DisposHandle                ;TOSS IT
  221.           MOVE.L    (SP)+,A2            ;RESTORE A2
  222.           MOVE.L    (SP),4(SP)            ;FIXUP STACK AND RETURN
  223.           ADDQ.L    #4,SP
  224.           RTS
  225.  
  226.  
  227. ;  PROCEDURE SpeechRate(SpeechHandle: SpeechRecord; Rate: Integer);
  228.  
  229. ;      Set the speaking rate in words/minute.  Range and validity
  230. ;      checking is done in SpeechPrime.
  231.  
  232. SpeechRate PROC         EXPORT    
  233.  
  234.           MOVE.L    (SP)+,D1            ;GET RETURN ADDR
  235.           MOVE.W    (SP)+,D2            ;GET RATE PARM
  236.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS
  237.           MOVE.L    D1,-(SP)            ;RESTORE RETURN ADDR
  238.  
  239.           MOVE.L    A0,-(SP)            ;SAVE DEVICE GLOBALS HANDLE
  240.           _HLock                ;LOCK IT
  241.           MOVE.L    (A0),A1            ;DEREF GLOBALS HANDLE
  242.  
  243.           LINK        A6,#-32              ;CREATE PARM BLOCK ON STACK
  244.           LEA        -32(A6),A0              ;POINT A0 AT PARM BLOCK
  245.  
  246.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)  ;SET SPEECH REFNUM
  247.           MOVE.W    #IDRate,CSCode(A0)          ;SET RATE PARM ID
  248.           MOVE.W    D2,CSParam(A0)          ;STORE RATE PARM
  249.  
  250.           _Control  ,IMMED
  251.  
  252.           UNLK        A6                    ;REMOVE DCE FROM STACK
  253.  
  254.           MOVE.L    (SP)+,A0            ;RESTORE DEVICE GLOBALS
  255.           _HUnlock                ;UNLOCK IT
  256.  
  257.           RTS
  258.  
  259.  
  260.  
  261. ;  PROCEDURE SpeechSex(SpeechHandle: SpeechRecord; SpeakerSex: Sex);
  262.  
  263. ;      Set the speaking sex as Male or Female.
  264.  
  265. SpeechSex PROC         EXPORT   
  266.  
  267.           MOVEQ        #0,D2            ;CLEAR
  268.           MOVE.L    (SP)+,D1            ;GET RETURN ADDR
  269.           MOVE.B    (SP)+,D2            ;GET SEX PARM (NOTE .B ON MOVE)
  270.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS
  271.           MOVE.L    D1,-(SP)            ;RESTORE RETURN ADDR
  272.  
  273.           MOVE.L    A0,-(SP)            ;SAVE GLOBALS ON STACK
  274.           _HLock                ;LOCK DEVICE GLOBALS
  275.           MOVE.L    (A0),A1            ;DEREFERENCE TO POINTER
  276.  
  277.           LINK        A6,#-32              ;CREATE PARM BLOCK ON STACK
  278.           LEA        -32(A6),A0              ;POINT A0 AT PARM BLOCK
  279.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)  ;SET SPEECH REFNUM
  280.           MOVE.W    #IDSex,CSCode(A0)          ;SET SEX PARM ID
  281.           MOVE.W    D2,CSParam(A0)          ;STORE SEX PARM
  282.  
  283.           _Control  ,IMMED
  284.  
  285.           UNLK        A6                ;REMOVE PARM BLOCK FROM STACK
  286.  
  287.           MOVE.L    (SP)+,A0            ;RESTORE GLOBALS HANDLE
  288.           _HUnlock                ;UNLOCK HANDLE
  289.  
  290.           RTS
  291.  
  292.  
  293.  
  294. ;  PROCEDURE SpeechPitch(SpeechHandle: SpeechRecord; Pitch: Integer; Mode: F0Mode);
  295.  
  296. ;      Sets the baseline pitch and the F0 mode.  All parameter
  297. ;      validity and range checking is done in SpeechPrime routines.
  298.  
  299. SpeechPitch PROC         EXPORT     
  300.  
  301.           MOVEQ        #0,D2            ;CLEAR THE BUGGER
  302.           MOVE.L    (SP)+,A1            ;GET RETURN ADDR
  303.           MOVE.B    (SP)+,D2            ;GET PITCH MODE
  304.           MOVE.W    (SP)+,D1            ;GET BASELINE PITCH
  305.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS HANDLE
  306.           MOVE.L    A1,-(SP)            ;RESTORE RETURN ADDR
  307.  
  308.           MOVE.L    A0,-(SP)            ;SAVE GLOBALS ON STACK
  309.           _HLock                ;LOCK GLOBALS
  310.           MOVE.L    (A0),A1            ;DEREFERENCE
  311.  
  312.           LINK        A6,#-32            ;CREATE ROOM FOR PARM BLOCK
  313.           LEA        -32(A6),A0
  314.           MOVE.W    SpeechRfNum(A1),IORefNum(A0)
  315.  
  316.           MOVE.W    #IDPitchMode,CSCode(A0)      ;SET MODE ID
  317.           MOVE.W    D2,CSParam(A0)          ;SET PITCH MODE
  318.           _Control  ,IMMED
  319.  
  320.           MOVE.W    #IDBaseline,CSCode(A0)      ;SET BASELINE ID
  321.           MOVE.W    D1,CSPARAM(A0)          ;SET BASELINE PITCH
  322.           _Control  ,IMMED
  323.  
  324.           UNLK        A6
  325.  
  326.           MOVE.L    (SP)+,A0            ;RESTORE GLOBALS HANDLE
  327.           _HUnlock                ;UNLOCK HANDLE
  328.  
  329.           RTS
  330.  
  331.  
  332.  
  333. ;  FUNCTION MacinTalk(SpeechHandle: SpeechRecord; phonemes: Handle): SpeechErr;
  334.  
  335. ;      Macintalk glue passes phonemes handle to speech driver
  336. ;      write routine.
  337.  
  338. MacinTalk FUNC         EXPORT   
  339.  
  340.           MOVE.L    (SP)+,D0            ;GET RETURN ADDR
  341.           MOVE.L    (SP)+,A1            ;GET INPUT HANDLE
  342.           MOVE.L    (SP)+,A0            ;GET DEVICE GLOBALS HANDLE
  343.           MOVE.L    D0,-(SP)            ;RESTORE RETURN ADDR
  344.  
  345.           MOVE.L    A0,-(SP)            ;SAVE ON STACK
  346.           _HLock                ;LOCK GLOBALS HANDLE
  347.  
  348.           MOVE.L    A1,A0            ;COPY INPUT HANDLE TO A0
  349.           _GetHandleSize            ;GET INPUT HANDLE SIZE IN D0
  350.  
  351.           MOVE.L    A2,-(SP)
  352.           MOVE.L    4(SP),A2
  353.           MOVE.L    (A2),A2
  354.  
  355.           LEA        Pblock(A2),A0          ;POINT A0 TO PARM BLOCK
  356.           MOVE.W    SpeechRfNum(A2),IORefNum(A0)  ;STORE REF NUM
  357.           MOVE.L    A1,IOBuffer(A0)          ;STORE INPUT HANDLE
  358.           MOVE.L    D0,IOByteCount(A0)          ;STORE INPUT HANDLE LENGTH
  359.  
  360.           _Write    ,IMMED            ;GO TO IT
  361.  
  362.           MOVE.L    (SP)+,A2            ;RESTORE A2
  363.           MOVE.L    (SP)+,A0            ;RESTORE DEVICE GLOBALS HANDLE
  364.           MOVE.W    D0,-(SP)            ;SAVE WRITE RETURN CODE
  365.           _HUnlock                ;UNLOCK GLOBALS
  366.           MOVE.W    (SP)+,D0            ;RESTORE WRITE RETURN CODE
  367.  
  368.           MOVE.W    D0,4(SP)            ;PUT RETURN CODE ON STACK
  369.           RTS
  370.  
  371.  
  372.  
  373. ; FUNCTION Reader(theSpeech: SpeechHandle;
  374. ;          English: Pointer;
  375. ;          EnglishLen: LongInt;
  376. ;          Output: Handle): Integer;
  377.  
  378.  
  379. Reader    FUNC         EXPORT           ;READER GLUE
  380.  
  381.           MOVE.L    16(SP),A0            ;GET DEVICE GLOBALS HANDLE
  382.           MOVE.L    12(SP),16(SP)
  383.           MOVE.L    8(SP),12(SP)
  384.           MOVE.L    4(SP),8(SP)
  385.           MOVE.L    (SP),4(SP)
  386.           ADDQ.L    #4,SP
  387.  
  388.           _HLock
  389.           MOVE.L    (A0),A0              ;DEREFERENCE GH
  390.           MOVE.L    ReaderHandle(A0),A0          ;GET HANDLE TO READER CODE
  391.           _HLock                  ;LOCK CODE DOWN
  392.  
  393.           MOVE.L    (A0),A0            ;GET PTR TO CODE
  394.           JMP        (A0)            ;GO DO IT
  395.  
  396.           RTS
  397.  
  398.           END 
  399.  
  400.